home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / tip / arraymac.tip < prev    next >
Text File  |  1993-09-15  |  7KB  |  214 lines

  1. % This macro source file is from the four volume series
  2. % "TeX in Practice" by Stephan von Bechtolsheim, published
  3. % 1993 by Springer-Verlag, New York.
  4. % Copyright 1993 Stephan von Bechtolsheim.
  5. % No warranty or liability is assumed.
  6. % This macro may be copied freely if no fees other than
  7. % media cost or shipping charges are charged and as long
  8. % as this copyright and the following source code itself
  9. % is not changed. Please see the series for further information.
  10. %
  11. % Version: 1.0
  12. % Date: May 1, 1993
  13. %
  14. %
  15. % This source code is documented in 20.3, p. III-136.
  16. % Original source in file "tokens3.TEX", starting line 1017.
  17. \wlog{L: "arraymac.tip" ["tokens3.TEX," l. 1017, p. III-136]}%
  18. % This file DOES belong to format "texip."
  19. \InputD{list-mac.tip}
  20. \InputD{rangetst.tip}
  21. \InputD{doloop.tip}
  22. \catcode`\@ = 11
  23. \def\IndexLastElement #1#2{%
  24.     \NumberOfListElements{#1}{#2}%
  25.     \advance #2 by -1
  26. }
  27. \newcount\@ArrayIndexCheckCount
  28. \def\ArrayIndexCheck #1#2{%
  29.     \IndexLastElement{#1}{\@ArrayIndexCheckCount}%
  30.     \ifnum\@ArrayIndexCheckCount = -1
  31.         \errmessage{\string\ArrayIndexCheck: array \string#2
  32.             is empty.}%
  33.     \else
  34.         \CheckRange{#2}{0}{\@ArrayIndexCheckCount}%
  35.             {\string\ArrayIndexCheck: index \number#2 out
  36.                 of range in list \string#1}%
  37.     \fi
  38. }
  39. \newcount\@AccessArrayElementLimit
  40. \newcount\@AccessArrayElementCount
  41. \def\AccessArrayElement #1#2#3{%
  42.     \ArrayIndexCheck{#1}{#2}%
  43.     \let\@AccessArrayElementList = #1%
  44.     \@AccessArrayElementLimit = #2\relax
  45.     \DoLoop{\@AccessArrayElementCount}% 
  46.         {1}{1}{\@AccessArrayElementLimit}%
  47.         {\DropFirstElementOfList{\@AccessArrayElementList}}%
  48.     \CarOfList{\@AccessArrayElementList}{#3}%
  49. }
  50. \newcount\@ModifyArrayElementCount
  51. \newcount\@ModifyArrayElementLimit
  52. \def\ModifyArrayElement #1#2#3{%
  53.     \ArrayIndexCheck{#1}{2}%
  54.     \IndexLastElement{#1}{\@ModifyArrayElementLimit}%
  55.     \let\@ModifyArrayList = #1%
  56.     \def\@ModifyArrayRet{}%
  57.     \DoLoop{\@ModifyArrayElementCount}% 
  58.         {0}{1}{\@ModifyArrayElementLimit}%
  59.         {%
  60.             \CarOfList{\@ModifyArrayList}%
  61.                 {\@ModifyArrayElement}%
  62.             \DropFirstElementOfList{\@ModifyArrayList}%
  63.             \ifnum\@ModifyArrayElementCount = #2\relax
  64.                 \RightAppendElement{\@ModifyArrayRet}{#3}%
  65.             \else
  66.                 \RightAppendElement
  67.                     {\@ModifyArrayRet}%
  68.                     {\@ModifyArrayElement}%
  69.             \fi
  70.         }%
  71.     \let #1 = \@ModifyArrayRet
  72. }
  73. \newcount\@InsertArrayElementCount
  74. \newcount\@InsertArrayElementCountTwo
  75. \def\InsertArrayElement #1#2#3{%
  76.     \ifnum\NumberOfListElementsNumConditional{#1}=0
  77.         \errmessage{\string\InsertArrayElement: empty array}%
  78.     \fi
  79.     \ifnum\NumberOfListElementsNumConditional{#1}=#2
  80.     \else
  81.             \ArrayIndexCheck{#1}{#2}%
  82.     \fi
  83.     \def\@InsertArrayElementListPre{}%
  84.     \ifnum #2>0
  85.         \@InsertArrayElementCount = #2\relax
  86.         \advance\@InsertArrayElementCount by -1
  87.         \ExtractSubArray{#1}{0}{\@InsertArrayElementCount}%
  88.             {\@InsertArrayElementListPre}%
  89.     \fi
  90.     \def\@InsertArrayElementListPost{}%
  91.     \IndexLastElement{#1}{\@InsertArrayElementCount}%
  92.     \ifnum #2 > \@InsertArrayElementCount
  93.     \else
  94.         \ExtractSubArray{#1}{#2}{\@InsertArrayElementCount}%
  95.             {\@InsertArrayElementListPost}%
  96.     \fi
  97.     \RightAppendElement{\@InsertArrayElementListPre}{#3}%
  98.     \CombineTwoLists
  99.         {\@InsertArrayElementListPre}%
  100.         {\@InsertArrayElementListPost}%
  101.         {\@InsertArrayElementListPre}%
  102.     \let #1 = \@InsertArrayElementListPre
  103. }
  104. \newcount\@DeleteArrayElementCount
  105. \newcount\@DeleteArrayElementLimit
  106. \def\DeleteArrayElement #1#2{%
  107.     \ArrayIndexCheck{#1}{#2}%
  108.     \let\@DeleteArrayElementList = #1%
  109.     \IndexLastElement{#1}{\@DeleteArrayElementLimit}%
  110.     \ifnum\@DeleteArrayElementLimit = -1
  111.         \errmessage{\string\DeleteArrayElement: empty array.}%
  112.     \fi
  113.     \def\@DeleteArrayElementResultList{}%
  114.     \DoLoop{\@DeleteArrayElementCount}% 
  115.         {0}{1}{\@DeleteArrayElementLimit}%
  116.         {%
  117.             \CarOfList{\@DeleteArrayElementList}%
  118.                 {\@DeleteArrayElement}%
  119.             \DropFirstElementOfList{\@DeleteArrayElementList}%
  120.             \ifnum\@DeleteArrayElementCount = #2\relax
  121.             \else
  122.                 \RightAppendElement
  123.                     {\@DeleteArrayElementResultList}%
  124.                     {\@DeleteArrayElement}%
  125.             \fi
  126.         }%
  127.     \let #1=\@DeleteArrayElementResultList
  128. }
  129. \newcount\@DeleteArrayElementRangeCount
  130. \newcount\@DeleteArrayElementRangeLimit
  131. \def\DeleteArrayElementRange #1#2#3{%
  132.     \ArrayIndexCheck{#1}{#2}%
  133.     \ArrayIndexCheck{#1}{#3}%
  134.     \ifnum #2>#3
  135.         \errmessage{\string\DeleteArrayElementRange:
  136.             first index larger than second. Makes no
  137.             sense}%
  138.     \fi
  139.     \@DeleteArrayElementRangeLimit = #3\relax
  140.     \advance\@DeleteArrayElementRangeLimit by -#2%
  141.     \advance\@DeleteArrayElementRangeLimit by 1
  142.     \DoLoop{\@DeleteArrayElementRangeCount}{1}{1}%
  143.         {\@DeleteArrayElementRangeLimit}%
  144.         {\DropArrayElement{#1}{#2}}%
  145. }
  146. \newcount\@ShowArrayCount
  147. \newcount\@ShowArrayLimit
  148. \def\ShowArray #1{%
  149.     \wlog{\string\ShowArray: begin}%
  150.     \IndexLastElement{#1}{\@ShowArrayLimit}%
  151.     \ifnum\@ShowArrayLimit = -1
  152.         \wlog{** empty array **}%
  153.     \else
  154.         \DoLoop{\@ShowArrayCount}{0}{1}{\@ShowArrayLimit}{%
  155.             \AccessArrayElement{#1}{\@ShowArrayCount}%
  156.                 {\@ShowArrayElement}%
  157.             \wlog{Index \the\@ShowArrayCount:
  158.                 "\@ShowArrayElement"}%
  159.         }%
  160.     \fi
  161.     \wlog{\string\ShowArray: end}%
  162.     \wlog{}%
  163. }
  164. \def\@TokenToListDoneMacro{\@TokensToListDone}%
  165. \def\TokensToTeXList #1#2{%
  166.     \def#1{}%
  167.     \def\@TokensToListName{#1}%
  168.     \@TokensToList #2\@TokensToListDone
  169. }
  170. \def\@TokensToList #1{%
  171.     \def\@TokensToListMacArgOne{#1}%
  172.     \ifx\@TokensToListMacArgOne\@TokenToListDoneMacro
  173.         \let\@TokensToListNext = \relax
  174.     \else
  175.         \expandafter\RightAppendElement\@TokensToListName{#1}%
  176.         \let\@TokensToListNext = \@TokensToList
  177.     \fi     
  178.     \@TokensToListNext
  179. }
  180. \newcount\@ExtractArrayCount
  181. \newcount\@ExtractArrayLimit
  182. \newif\if@ExtractCopy
  183. \def\ExtractSubArray #1#2#3#4{%
  184.     \ArrayIndexCheck{#1}{#2}%
  185.     \ArrayIndexCheck{#1}{#3}%
  186.     \ifnum #3<#2
  187.         \errmessage{\string\ExtractSubArray: first index >
  188.             second index, error}%
  189.     \fi
  190.     \def\@ExtractSubArrayResult{}%
  191.     \IndexLastElement{#1}{\@ExtractArrayLimit}%
  192.     \DoLoop{\@ExtractArrayCount}{0}{1}{\@ExtractArrayLimit}%
  193.         {%
  194.             \@ExtractCopytrue
  195.             \ifnum\@ExtractArrayCount < #2\relax
  196.                 \@ExtractCopyfalse
  197.             \fi
  198.             \ifnum\@ExtractArrayCount > #3\relax
  199.                 \@ExtractCopyfalse
  200.             \fi
  201.             \if@ExtractCopy
  202.                 \AccessArrayElement
  203.                     {#1}%
  204.                     {\@ExtractArrayCount}%
  205.                     {\@SubArrayElement}%
  206.                 \RightAppendElement
  207.                     {\@ExtractSubArrayResult}%
  208.                     {\@SubArrayElement}%
  209.             \fi
  210.         }%
  211.     \let #4 = \@ExtractSubArrayResult
  212. }
  213. \catcode`\@ = 12
  214.